

#include "drv_pwmRGBLight.h"

#include "ohos_init.h" // 用于初始化服务(services)和功能(features)
#include "cmsis_os2.h" // CMSIS-RTOS API V2

#include "pwm.h"
#include "iot_gpio.h"   
#include "iot_gpio_ex.h"
#include "iot_pwm.h"

// 核心板三色灯PWM控制
// 注意：GPIO9引脚可以正常输出PWM信号，GPIO5引脚无法正常输出PWM信号
// 需要将GPIO9引脚和GPIO5引脚短接，使用GPIO9引脚控制RGB三色灯



// 高电平持续时间为300ns，低电平持续时间为2.1us，周期为2.4us
pwm_config_t cfg_code0 = {14,     // 低电平持续tick 时间 = tick * (1/32000000)
                          2,      // 高电平持续tick 时间 = tick * (1/32000000)
                          0,      // 相位偏移位
                          0,      // 发多少个波形
                          false}; // 是否循环

// 高电平持续时间为600ns，低电平持续时间为2.1us，周期为2.7us
pwm_config_t cfg_code1 = {14,     // 低电平持续tick 时间 = tick * (1/32000000)
                          4,      // 高电平持续tick 时间 = tick * (1/32000000)
                          0,      // 相位偏移位
                          0,      // 发多少个波形
                          false}; // 是否循环

static uint16_t cnt_tick_time = 0;

#if 0
// 1码
void one_num(void)
{
    uapi_pwm_open(RGB_PWM, &cfg_code1);
    // 每个通道对应一个bit位
    // uapi_pwm_set_group(PWM_GROUP_ID, 255);   // 255: 0b11111111，全通道输出
    uapi_pwm_set_group(RGB_PWM, 1 << RGB_PWM); // 1 << RGB_PWM: 0b00000010，只有RGB_PWM通道输出
    // uapi_pwm_start_group(PWM_GROUP_ID); // 同时开启组内所有通道，当前SDK版本不支持
    uapi_pwm_start(RGB_PWM); // 单独开启RGB_PWM通道
    uapi_pwm_close(RGB_PWM);
    uapi_tcxo_delay_us(1);
}

// 0码
void zero_num(void)
{
    uapi_pwm_open(RGB_PWM, &cfg_code0);
    uapi_pwm_set_group(RGB_PWM, 1 << RGB_PWM);
    uapi_pwm_start(RGB_PWM);
    uapi_pwm_close(RGB_PWM);
    uapi_tcxo_delay_us(1);
}


// 点亮绿色灯: 1 0 0
void green_led(void)
{
    for (int i = 0; i < 8; i++)
    {
        one_num();
    }
    for (int i = 0; i < 8; i++)
    {
        zero_num();
    }
    for (int i = 0; i < 8; i++)
    {
        zero_num();
    }
}

// 点亮红色灯: 0 1 0
void red_led(void)
{
    for (int i = 0; i < 8; i++)
    {
        zero_num();
    }
    for (int i = 0; i < 8; i++)
    {
        one_num();
    }
    for (int i = 0; i < 8; i++)
    {
        zero_num();
    }
}

// 点亮蓝色灯: 0 0 1
void blue_led(void)
{
    for (int i = 0; i < 8; i++)
    {
        zero_num();
    }
    for (int i = 0; i < 8; i++)
    {
        zero_num();
    }
    for (int i = 0; i < 8; i++)
    {
        one_num();
    }
}

/**
 * @brief 
 * 
 */
void initPwmRGBLight(void)
{
    uapi_pin_set_mode(RGB_GPIO, PWM_FUNC); // 设置GPIO9引脚为PWM输出
    uapi_pwm_init();                       // 初始化PWM

    // 循环点亮三色灯
    // {
    //     green_led();
    //     osDelay(10);
    //     red_led();
    //     osDelay(10);
    //     blue_led();
    //     osDelay(10);
    // }
}

/**
 * @brief 
 * 
 */
void pwmRGBLightBlink(void)
{
    switch (cnt_tick_time)
    {
    case 0:
        red_led();
        break;
    case 1:
        green_led();
        break;
    case 2:
        blue_led();
        break;
    
    default:
        break;
    }
    cnt_tick_time ++;
    cnt_tick_time = cnt_tick_time % 3;
}

// static void BoardRgbTask(void *arg)
// {
//     (void)arg;

//     uapi_pin_set_mode(RGB_GPIO, PWM_FUNC); 
//     uapi_pwm_init();                       

//     while (1)
//     {
        
//         pwmRGBLightBlink();
//         osDelay(100); 
//     }
// }

// void BoardRgbEntry(void)
// {
    
//     osThreadAttr_t attr;
//     attr.name = "BoardRgbTask";
//     attr.stack_size = 1024 * 2;
//     attr.priority = osPriorityNormal;

//     if (osThreadNew(BoardRgbTask, NULL, &attr) == NULL)
//     {
//         printf("[BoardRgbEntry] Falied to create BoardRgbTask!\n");
//     }
// }

// APP_FEATURE_INIT(BoardRgbEntry);
#endif



// -----------------------------------------------------------------------------------
// -----------------------------------------------------------------------------------
// -----------------------------------------------------------------------------------

// #define PWM_GPIO                IOT_IO_NAME_GPIO_5    // PWM对应的GPIO引脚
// #define PWM_FUNC                IOT_IO_FUNC_GPIO_5_PWM5_OUT
// #define PWM_PORT                5                      // PWM端口

#define PWM_GPIO                IOT_IO_NAME_GPIO_9    // PWM对应的GPIO引脚
#define PWM_FUNC                IOT_IO_FUNC_GPIO_9_PWM1_OUT
#define PWM_PORT                1                      // PWM端口

#define Frequency               2000   //pwm接口不能输出低于1300hz的pwm,只能通过IO模拟的方式输出

void one_num(void)
{
    // uapi_pwm_clear_group(PWM_PORT);
    IoTPwmCfgStart(PWM_PORT, &cfg_code1);
    // osDelay(1);
    uapi_pwm_clear_group(PWM_PORT);
    uapi_tcxo_delay_us(1);
}

// 0码
void zero_num(void)
{
    // uapi_pwm_clear_group(PWM_PORT);
    IoTPwmCfgStart(PWM_PORT, &cfg_code0);
    // osDelay(1);
    uapi_pwm_clear_group(PWM_PORT);
    uapi_tcxo_delay_us(1);
}


// 点亮绿色灯: 1 0 0
void green_led(void)
{
    for (int i = 0; i < 8; i++)
    {
        one_num();
    }
    for (int i = 0; i < 8; i++)
    {
        zero_num();
    }
    for (int i = 0; i < 8; i++)
    {
        zero_num();
    }
}

// 点亮红色灯: 0 1 0
void red_led(void)
{
    for (int i = 0; i < 8; i++)
    {
        zero_num();
    }
    for (int i = 0; i < 8; i++)
    {
        one_num();
    }
    for (int i = 0; i < 8; i++)
    {
        zero_num();
    }
}

// 点亮蓝色灯: 0 0 1
void blue_led(void)
{
    for (int i = 0; i < 8; i++)
    {
        zero_num();
    }
    for (int i = 0; i < 8; i++)
    {
        zero_num();
    }
    for (int i = 0; i < 8; i++)
    {
        one_num();
    }
}

void pwmRGBLightBlink(void)
{
    printf("\r[long] RGB light = %d\n", cnt_tick_time);
    switch (cnt_tick_time)
    {
    case 0:
        red_led();
        break;
    case 1:
        green_led();
        break;
    case 2:
        blue_led();
        break;
    
    default:
        break;
    }
    cnt_tick_time ++;
    cnt_tick_time = cnt_tick_time % 3;
}

static void PwmTask(void *arg)
{
    (void)arg;

    // 初始化GPIO模块
    IoTGpioInit(PWM_GPIO);
    // 设置PWM GPIO为PWM模式
    uint32_t ret = IoSetFunc(PWM_GPIO, PWM_FUNC);
    if (ret == 0) 
    {
        printf("[long] [PwmExample] Io Set PWM Func OK ... \r\n");
    }

    // 初始化PWM模块
    ret = IoTPwmInit(PWM_PORT);
    if (ret == 0) 
    {
        printf("[long] [PwmExample] Io Set PWM Init OK ... \r\n");
    }

    while (1) 
    {
        // for (int i = 0; i < 100; i++) 
        // {
        //     IoTPwmStart(PWM_PORT, i, Frequency);
        //     osDelay(5);
        //     uapi_pwm_clear_group(PWM_PORT);
        // }
        pwmRGBLightBlink();
        osDelay(100); 
    }
}

// 入口函数
static void PwmEntry(void)
{
    // 定义线程属性
    osThreadAttr_t attr;
    attr.name = "PwmTask";
    attr.stack_size = 2048;  
    attr.priority = osPriorityNormal;
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;

    // 创建线程
    if (osThreadNew(PwmTask, NULL, &attr) == NULL)
    {
       printf("[PwmExample] Falied to create PwmTask!\n");
    }
}

// 运行入口函数
// SYS_RUN(PwmEntry);


